package com.myalibaba.example;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadExample {
    public static void main(String[] args) throws Exception{
        // 创建一个线程池，用于执行多个任务
        ExecutorService executor = Executors.newFixedThreadPool(5);
        Object obj = null;
        // 向线程池提交多个任务
        for (int i = 0; i < 10; i++) {
            Task task = new Task("Task " + i);
            System.out.println("Task " + i+"任务提交");
            obj = executor.submit(task).get();
            System.out.println("线程返回值:"+obj);
        }

        // 关闭线程池
        /**
         * executor.shutdown() 是 Java 中 ExecutorService 接口提供的一个方法，用于关闭线程池。
         * 在调用 shutdown() 方法后，线程池不再接受新的任务提交，但会等待已经提交的任务执行完成。所有已经提交但尚未执行的任务都会继续执行，直到所有任务执行完成后，线程池才会真正地关闭。
         * 如果你希望立即关闭线程池，可以使用 executor.shutdownNow() 方法。这个方法会尝试立即停止所有正在执行的任务，并且不会等待已经提交但尚未执行的任务执行完成。
         */
        executor.shutdown();
        System.out.println("方法执行结束");
    }

    //有返回值的任务必须实现 Callable 接口，类似的，无返回值的任务必须 Runnable 接口
    static class Task implements Callable {
        private String name;
        public Task(String name) {
            this.name = name;
        }
        @Override
        public Object call(){
            // 模拟任务执行
            System.out.println(name + " is executing in thread: " + Thread.currentThread().getName());
            try {
                Thread.sleep(1000); // 模拟任务执行时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return name + " has finished executing.";
        }
    }
}
